#include "lnkhandler.h"
#include <QDebug>
#include <QDesktopServices>
#include <QDir>
#include <QPropertyAnimation>

#include "settinghandler.h"
#include "widget.h"
#include "hubwidget.h"

LNKHandler::LNKHandler(const QString& lnk_dir, const QString& init_file, QWidget* parent_widget)
    : LNKBaseHandler(lnk_dir, init_file, parent_widget)
{
    qDebug() << "LNKHandler 创建了";

    /* 执行完本构造函数之后，配置文件的信息和文件夹中有的快捷方式同步，
     * 文件夹中所有存在的快捷方式以AppLNK*的形式添加到了applnk_list中 */

    // 获取文件夹下的所有快捷方式名
    QDir dir(lnk_dir);
    if (! dir.exists())
        dir.mkdir(dir.absolutePath());
    dir.setFilter(QDir::Files);
    auto links_list = dir.entryList();

    // 根据读取的配置文件里的顺序进行初始化
    for (QString& lnk_name : read_all())
    {
        auto index = links_list.indexOf(lnk_name + ".lnk");
        // 如果hub_links文件夹中没有该快捷方式，就不创建，在for循环外面write_all()的时候会把它删除
        if (index != -1)
        {
            auto lnk = create_applnk(lnk_name);
            applnk_list.push_back(lnk);
            // 从lnks_list中去除
            links_list.remove(index);
        }
    }
    // 如果hub_links文件夹子下有该快捷方式，而配置文件里没有，就把它添加到末尾
    for (const auto& lnk_path : links_list)
    {
        auto lnk = create_applnk(lnk_path);
        applnk_list.push_back(lnk);
    }

    write_all();  // 覆盖一下配置文件，去掉hub_links中不存在的快捷方式，增加配置文件中没有的但在hub_links中存在的快捷方式s
}

// 创建一个app_lnk
AppLNK* LNKHandler::create_applnk(const QString& lnk_name)
{
    AppLNK* app_lnk = new AppLNK(lnk_name, lnk_dir_, parent_widget_);

    // 连接左击事件
    parent_widget_->connect(app_lnk, &AppLNK::left_clicked_me, parent_widget_, [this, app_lnk]()
    {
        static_cast<Widget*>(parent_widget_)->change_menu_ptr({});  // 如果有打开的菜单，则关闭
        static_cast<Widget*>(parent_widget_)->open_file(app_lnk->get_absolute_path(), app_lnk);
    });
    // 连接右击事件
    parent_widget_->connect(app_lnk, &AppLNK::right_clicked_me, parent_widget_, [this, app_lnk]()
    {
        auto parent = static_cast<Widget*>(parent_widget_);
        parent->change_menu_ptr({"打开", "打开方式", "打开文件所在位置", "以管理员运行", "更换图标", "移除", "取消"});
        parent->get_menu_ptr()->move(parent->x() + app_lnk->x() + (app_lnk->width() - parent->get_menu_ptr()->width()) / 2, parent->y() - parent->get_menu_ptr()->height() - 10);
        parent->get_menu_ptr()->show();

        // 连接该右键菜单的点击事件
        parent->connect(parent->get_menu_ptr(), &MenuWidget::clicked_item, parent, [=](QString word)
        {
            parent->change_menu_ptr({});
            if (word == "打开")
            {
                parent->open_file(app_lnk->get_absolute_path(), app_lnk);
            }
            else if (word == "打开方式")
            {

            }
            else if (word == "打开文件所在位置")
            {
                parent->open_file(app_lnk->get_absolute_dir());
            }
            else if (word == "以管理员运行")
            {
                QDesktopServices::openUrl(QUrl::fromLocalFile(app_lnk->get_absolute_path()));
            }
            else if (word == "更换图标")
            {

            }
            else if (word == "移除")
            {
                delete_lnk(app_lnk);  // 从文件中删除
                app_lnk->deleteLater();  // 释放内存
                parent->refresh_all();
            }
        });
    });
    // 连接移动事件
    parent_widget_->connect(app_lnk, &AppLNK::change_index, parent_widget_, [this, app_lnk](int pos_x, int pos_y)
    {
        auto parent = static_cast<Widget*> (parent_widget_);

        // 拖到了hub图标上
        if (parent->get_hub_lnk()->contentsRect().contains(pos_x, pos_y))
        {
            // 在hub_links文件夹里创建快捷方式
            HubWidget::get_instance()->push_back_lnk(app_lnk->get_absolute_path());

            // 从界面上和init文件里、links文件夹里删除
            delete_lnk(app_lnk);
            parent->refresh_all();
        }
        else if (parent->contentsRect().contains(pos_x, pos_y))
        {
            qsizetype new_index = (pos_x - SettingHandler::get_instance()->get_border_size() - SettingHandler::get_instance()->get_lnk_size() / 2) / SettingHandler::get_instance()->get_dx();
            if (new_index > get_size())
                new_index = get_size();

            move_lnk(new_index, app_lnk);
            parent->refresh_all();
        }
        else
        {
            delete_lnk(app_lnk);  // 从文件中删除
            static_cast<Widget*>(parent_widget_)->refresh_all();
        }
    });

    return app_lnk;
}

LNKHandler::~LNKHandler()
{
    qDebug() << "LNKHandler 销毁了";
}
